Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Java -> PHP (przepisanie kodu)
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Znalazłem pewien kod w JAVIe, który rozwiązuje mój problem.

http://stackoverflow.com/questions/3026263...=active#tab-top

Niestety utknąłem w jego przepisywaniu.

  1. $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. // $str - tutaj nie rozumiem
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < 3)
  11. $result += $alphabet[0];
  12.  
  13. // tej pętli nie rozumiem, co to za "c"? Litera 'c', zmienna $c? Ogólnie dziwna ta pętla?
  14. for ($c : $str)
  15. $result += $alphabet[$chars[strpos($c)]];
  16.  
  17. echo $result .'<br />';
  18.  
  19. }


Ten post edytował markonix 20.08.2013, 12:19:36
Go to the top of the page
+Quote Post
freemp3
post
Post #2





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


Instrukcja:
Kod
String str = Integer.toString(i, alphabet.length);

rzutuje liczbę w zmiennej i na string, jednak nie dłuższy niż alphabet.length.

Odnośnie pętli jest to odpowiednik foreach, taka konstrukcja w php nie przejdzie. Zmienna str jest rzutowana na tablicę znakową i przy każdym przejściu pętli kolejne elementy są przypisywane do zmiennej c.
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  1. String str = Integer.toString(i, alphabet.length);
Do zmiennej str zostaje przypisana reprezentacja liczby w systemie liczbowym odpowiadającym długości tablicy alphabet: http://docs.oracle.com/javase/7/docs/api/j...ml#toString(int, int) - w PHP uzyskasz to samo przy pomocy base_convert.

Natomiast pętlę lecącą po każdym znaku mógłbyś utworzyć w ten sposób:
  1. foreach (explode('', $str) as $c) {
  2. // ...
  3. }
Go to the top of the page
+Quote Post
markonix
post
Post #4





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Kod
        final String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

        int wordLength = 3;
        char[] alphabet = { 'a', 'b', 'c' };

        for (int i = 0; i < Math.pow(wordLength, alphabet.length); i++) {

            String str = Integer.toString(i, alphabet.length);

            String result = "";
            while (result.length() + str.length() < wordLength)
                result += alphabet[0];

            for (char c : str.toCharArray())
                result += alphabet[chars.indexOf(c)];

            System.out.println(result);
        }


  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < $wordLength)
  11. $result += $alphabet[0];
  12.  
  13. foreach (explode('', $str) as $c)
  14. $result += $alphabet[strpos($chars, $c)];
  15.  
  16. echo $result .'<br />';
  17.  
  18. }


Takie coś mi wyszło, niestety zapętla się się w jakimś miejscu i wywala.

Ten post edytował markonix 20.08.2013, 12:59:40
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


W PHP operatorem łączenia ciągów jest kropka, nie plus, czyli ".=" zamiast "+=" przy zmiennej $result.
Go to the top of the page
+Quote Post
markonix
post
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < $wordLength) {
  11. $result .= $alphabet[0];
  12. }
  13.  
  14. foreach ($str as $c)
  15. $result .= $alphabet[strpos($chars, $c)];
  16.  
  17. echo $result .'<br />';
  18. }


Tak, właśnie też to poprawiłem i zapętlenia nie ma choć jeszcze są błędy.

Ok. Wreszcie się udało.

Nie rozdzielał dobrze znaków w tym ostatnim foreach.

  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c', 'd');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8. $result = '';
  9. while (strlen($result) + strlen($str) < $wordLength) {
  10. $result .= $alphabet[0];
  11. }
  12.  
  13. foreach (str_split($str) as $c)
  14. $result .= $alphabet[strpos($chars, $c)];
  15.  
  16. echo $result .'<br />';
  17.  
  18. }


Jeszcze jeden edit. Na odwrót potęgi.. Przy większych testach zaczynało się znowu psuć..

Kod prawidłowy:

  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 2;
  3. $alphabet = array('a', 'b', 'c', 'd', 'e');
  4.  
  5. for ($i = 0; $i < pow(count($alphabet), $wordLength); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8. $result = '';
  9.  
  10. while (strlen($result) + strlen($str) < $wordLength) {
  11. $result .= $alphabet[0];
  12. }
  13.  
  14. foreach (str_split($str) as $c)
  15. $result .= $alphabet[strpos($chars, $c)];
  16.  
  17. echo $i .' '. $result .'<br />';
  18.  
  19. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 08:44